﻿#include "Common.h"
#include "JsonFormat.h"

// json 压缩
std::string JsonCompress(const char * pSrc)
{
    return RemoveSpaceAndEnter(pSrc);
}

// json 格式化
std::string JsonFormat(const char *pJson, int nIndentSpaceNum)
{
    try
    {
        if (NULL == pJson)
        {
            return std::string("");
        }
        std::string strJsonCompress = RemoveSpaceAndEnter(pJson);
        int nQuotCnt = 0;       // 双引号个数
        int nSpaceNum = 0;      // 空格个数
        std::string strJsonFormat = "";     // 格式化后的json
        for (size_t i = 0; strJsonCompress[i]; i++)
        {
            // 遇到 “"”
            if (strJsonCompress[i] == '\"')
            {
                nQuotCnt++;
            }
            // 双引号之间不做换行
            if (nQuotCnt % 2 != 0)
            {
                strJsonFormat += strJsonCompress[i];
                continue;
            }
            // “{”或“[”后面换行
            else if (strJsonCompress[i] == '{' || strJsonCompress[i] == '[')
            {
                strJsonFormat += strJsonCompress[i];
                strJsonFormat += "\r\n";
                nSpaceNum += nIndentSpaceNum;
            }
            // “,"”中间添加换行
            else if (i < strJsonCompress.length() - 1 && strJsonCompress[i] == ',' && strJsonCompress[i + 1] == '"')
            {
                strJsonFormat += strJsonCompress[i];
                strJsonFormat += "\r\n";
            }
            // “]”前面添加换行并添加缩进
            else if (strJsonCompress[i] == ']')
            {
                // 如果前一个是“[”或“]”，去除“[]”或“]]”之间添加的缩进
                if (i > 0 && (strJsonCompress[i - 1] == '[' || strJsonCompress[i - 1] == ']'))
                {
                    // 空格个数+"\r\n"的长度
                    size_t nStartIdx = strJsonFormat.length() - nSpaceNum - 2;
                    // 前面添加了缩进
                    if (strJsonFormat[strJsonFormat.length() - 1] == ' ')
                    {
                        strJsonFormat.erase(nStartIdx);
                    }
                    if (strJsonCompress[i - 1] == '[')
                    {
                        strJsonFormat += strJsonCompress[i];
                        nSpaceNum -= nIndentSpaceNum;
                        continue;
                    }
                }
                strJsonFormat += "\r\n";
                nSpaceNum -= nIndentSpaceNum;
                for (int j = 0; j < nSpaceNum; j++)
                {
                    strJsonFormat += " ";
                }
                strJsonFormat += strJsonCompress[i];
                continue;
            }
            // “}”前面添加换行并添加缩进
            else if (strJsonCompress[i] == '}')
            {
                // 如果前一个是“{”或“}”，去除“{}”或“}}”之间添加的缩进
                if (i > 0 && (strJsonCompress[i - 1] == '{' || strJsonCompress[i - 1] == '}'))
                {
                    // 空格个数+"\r\n"的长度
                    size_t nStartIdx = strJsonFormat.length() - nSpaceNum - 2;
                    // 前面添加了缩进
                    if (strJsonFormat[strJsonFormat.length() - 1] == ' ')
                    {
                        strJsonFormat.erase(nStartIdx);
                    }
                }
                nSpaceNum -= nIndentSpaceNum;
                if (i > 0 && strJsonCompress[i - 1] != '{')
                {
                    strJsonFormat += "\r\n";
                    for (int j = 0; j < nSpaceNum; j++)
                    {
                        strJsonFormat += " ";
                    }
                }
                strJsonFormat += "}";
                // “},”后面添加换行
                if (i < strJsonCompress.length() - 1 && strJsonCompress[i + 1] == ',')
                {
                    // "},"后面添加换行
                    strJsonFormat += ",\r\n";
                    i += 1;
                }
                // “}}”之间添加换行
                else if (i > 0 && i < strJsonCompress.length() - 1 && strJsonCompress[i - 1] == '}')
                {
                    strJsonFormat += "\r\n";
                }
                else
                {
                    continue;
                }
            }
            else
            {
                // 默认情况直接赋值
                strJsonFormat += strJsonCompress[i];
                continue;
            }
            // 根据空格个数添加空格
            for (int j = 0; j < nSpaceNum; j++)
            {
                strJsonFormat += " ";
            }
        }
        return strJsonFormat;
    }
    catch (const std::exception&) {}
    return std::string(pJson);
}
